package Persistencia;

import Utilidades.Settings;
import java.sql.SQLException;

/**
 * Controla el acceso a la base de datos, y ofrece funciones practicas.
 * @author Mj
 */
public class DBManager {

    private static DBManager instancia;
    private String dbURL;
    private String dbUser;
    private String dbPass;

    private DBManager() {
        Settings settings = Settings.getInstance();
        dbURL = "jdbc:mysql://" + settings.getDbURL();
        dbUser = settings.getDbUser();
        dbPass = settings.getDbPass();
    }

    public static DBManager getInstance() {
        if (instancia == null) {
            instancia = new DBManager();
        }
        return instancia;
    }

    /**
     * Devuelve una nueva conexion a la base de datos. Lanza excepciones para que
     * el que llama se haga cargo en cada caso.
     * @return La conexion recientemente creada.
     * @throws SQLException
     * @throws ClassNotFoundException
     * @throws InstantiationException
     * @throws IllegalAccessException 
     */
    public java.sql.Connection getNuevaConexion()
            throws SQLException, ClassNotFoundException, InstantiationException, IllegalAccessException {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        return java.sql.DriverManager.getConnection(dbURL, dbUser, dbPass);

    }

    /**
     * Abre una conexion a la base de datos, y devuelve el resultset.
     * Para evitar inyecciones SQL, no se deberian usar cadenas generadas en tiempo
     * de ejecucucion.
     * @param consulta
     * @return Resultset recientemente creado
     * @throws ClassNotFoundException
     * @throws InstantiationException
     * @throws IllegalAccessException
     * @throws SQLException 
     */
    public java.sql.ResultSet getSELECT(String consulta)
            throws ClassNotFoundException, InstantiationException, IllegalAccessException, SQLException {
        java.sql.Statement stmt = getNuevaConexion().createStatement();
        return stmt.executeQuery(consulta);
    }
}
